package com.hsnn.medstgmini.sys.service.impl;

import javax.transaction.Transactional;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hsnn.medstgmini.base.dict.dao.DicAreaDao;
import com.hsnn.medstgmini.base.dict.dao.DicCompTypeDao;
import com.hsnn.medstgmini.base.dict.dao.DicHosptypeDao;
import com.hsnn.medstgmini.base.dict.model.DicArea;
import com.hsnn.medstgmini.base.dict.model.DicCompType;
import com.hsnn.medstgmini.base.std.dao.StdCompinfoDao;
import com.hsnn.medstgmini.base.std.dao.StdCompinfoDetailDao;
import com.hsnn.medstgmini.base.std.dao.StdCompinfoLogDao;
import com.hsnn.medstgmini.base.std.dao.StdHospInfoDao;
import com.hsnn.medstgmini.base.std.model.HospInfo;
import com.hsnn.medstgmini.base.std.model.HospInfoDetail;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.base.std.model.StdCompinfoDetail;
import com.hsnn.medstgmini.base.std.model.StdCompinfoDetailLog;
import com.hsnn.medstgmini.base.std.model.StdCompinfoLog;
import com.hsnn.medstgmini.sys.dao.SysUserAuditDao;
import com.hsnn.medstgmini.sys.model.AuditType;
import com.hsnn.medstgmini.sys.model.RegCompInfo;
import com.hsnn.medstgmini.sys.model.RegHospInfo;
import com.hsnn.medstgmini.sys.service.SysUserAuditManager;
import com.hsnn.medstgmini.util.DateUtil;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.PinYin;

/**
 * @category 注册用户审核
 * @author 蔡春龙
 * @date 2015年6月25日
 */
@Service
public class SysUserAuditManagerImpl implements SysUserAuditManager {

	@Autowired
	private SysUserAuditDao userAuditDao;

	@Autowired
	private DicAreaDao areaDao;

	@Autowired
	private DicHosptypeDao hospTypeDao;

	@Autowired
	private StdHospInfoDao hospInfoDao;

	@Autowired
	private StdCompinfoDao compinfoDao;

	@Autowired
	private StdCompinfoLogDao compinfoLogDao;

	@Autowired
	private StdCompinfoDetailDao compinfoDetailDao;

	@Autowired
	private DicCompTypeDao compTypeDao;

	/**
	 * @category 根据id查询医疗机构注册信息
	 * @date 2015年6月24日
	 * @param hospId
	 * @return
	 */
	public RegHospInfo getAuditHospById(String hospId) {
		return userAuditDao.getAuditHospById(hospId);
	}

	/**
	 * @category 分页查询医疗机构注册信息审核列表
	 * @date 2015年6月24日
	 * @param page
	 * @param hospInfo
	 * @return
	 */
	public Pagination getAuditUserList(Pagination page, RegHospInfo hospInfo) {
		return userAuditDao.getAuditUserList(page, hospInfo);
	}

	/**
	 * @category 分页查询企业注册信息审核列表
	 * @date 2015年6月24日
	 * @param page
	 * @param compInfo
	 * @return
	 */
	public Pagination getAuditUserList(Pagination page, RegCompInfo compInfo) {
		return userAuditDao.getAuditUserList(page, compInfo);
	}

	/**
	 * @category 分页查询医疗机构注册信息审核日志列表
	 * @date 2015年6月24日
	 * @param page
	 * @param hospInfo
	 * @return
	 */
	public Pagination getAuditUserLogList(Pagination page, RegHospInfo hospInfo) {
		return userAuditDao.getAuditUserLogList(page, hospInfo);
	}

	/**
	 * @category 分页查询企业注册信息审核日志列表
	 * @date 2015年6月24日
	 * @param page
	 * @param compInfo
	 * @return
	 */
	public Pagination getAuditUserLogList(Pagination page, RegCompInfo compInfo) {
		return userAuditDao.getAuditUserLogList(page, compInfo);
	}

	/**
	 * @category 保存医疗机构注册信息审核
	 * @date 2015年6月23日
	 * @param hospInfo
	 */
	@Transactional
	public void saveAuditHosp(RegHospInfo hospInfo) {
		String hospId = "";
		if (hospInfo != null) {
			// 通过保存到基础库
			if (hospInfo.getAuditStatus() == AuditType.audited.getKey()) {
				DicArea area = areaDao.getDicAreaById(hospInfo.getArea()
						.getAreaid());
				// 入医疗机构基础库
				if (hospInfoDao.checkHospExist(hospInfo)) { // 覆盖更新
					HospInfo hi = hospInfoDao.getExistHosp(hospInfo);
					hospId = hi.getHospId();
					HospInfoDetail detail = hi.getHospInfoDetail();
					BeanUtils.copyProperties(hospInfo, hi);
					BeanUtils.copyProperties(hospInfo, detail);
					hi.setUpdUser(hospInfo.getAuditor());
					hi.setHospId(hospId);
					hi.setArea(area);
					detail.setUpdUser(hospInfo.getAuditor());
					hospInfoDao.saveHospInfo(hi, 1);
				} else { // 新增
					HospInfo hi = new HospInfo();
					HospInfoDetail detail = new HospInfoDetail();
					BeanUtils.copyProperties(hospInfo, hi);
					BeanUtils.copyProperties(hospInfo, detail);
					hi.setHospInfoDetail(detail);
					detail.setHospInfo(hi);
					hi.setUpdUser(hospInfo.getAuditor());
					hi.setArea(area);
					detail.setUpdUser(hospInfo.getAuditor());
					hospInfoDao.saveHospInfo(hi, 0);
				}
			}
			// 保存注册表
			userAuditDao.saveAuditHosp(hospInfo);
		}
	}

	/**
	 * @category 根据id查询医疗机构注册信息
	 * @date 2015年6月24日
	 * @param compId
	 * @return
	 */
	public RegCompInfo getAuditCompById(String compId) {
		return userAuditDao.getAuditCompById(compId);
	}

	/**
	 * @category 校验注册的企业在企业库中是否存在
	 * @date 2015年6月24日
	 * @param hospInfo
	 * @return
	 */
	public boolean checkCompExist(RegCompInfo compInfo) {
		return userAuditDao.checkCompExist(compInfo);
	}

	/**
	 * @category 保存企业注册信息审核
	 * @date 2015年6月23日
	 * @param hospInfo
	 */
	@Transactional
	public void saveAuditComp(RegCompInfo compInfo) {
		String compId = compInfo.getCompId();
		if (compInfo != null) {
			// 通过保存到基础库
			if (compInfo.getAuditStatus() == AuditType.audited.getKey()) {
				// 入基础库
				if (userAuditDao.checkCompExist(compInfo)) { // 覆盖更新
					StdCompinfo sci = userAuditDao.getExistComp(compInfo);
					if(sci != null){
						compInfo.setCompId(sci.getCompId());
					}
					saveCompInfo(sci, compInfo);
					compInfo.setCompId(compId);
				} else { // 新增
					StdCompinfo sci = new StdCompinfo();
					saveCompInfo(sci, compInfo);
				}
			}
			// 保存注册表
			userAuditDao.saveAuditComp(compInfo);
		}
	}

	private void saveCompInfo(StdCompinfo sci, RegCompInfo rci) {
		DicArea area = areaDao.getDicAreaById(rci.getArea().getAreaid());
		DicCompType compType = compTypeDao.getDicCompTypeById(rci.getCompReg()
				.getCompRegId());
		rci.setCompReg(compType);

		StdCompinfoDetail detail = sci.getStdCompinfoDetail();
		if (detail == null) {
			detail = new StdCompinfoDetail();
		}
		BeanUtils.copyProperties(rci, sci);
		BeanUtils.copyProperties(rci, detail);
		sci.setDicArea(area);
		sci.setUpdUser(rci.getAuditor());
		sci.setCompType((Short.valueOf(rci.getCompType())));
		sci.setStatus((short) 1);
		sci.setCompClassify((short) 0);
		sci.setMergeState((short) 0);
		sci.setCompRegId(compType.getCompRegId());
		sci.setCompSpelCode(PinYin.getPinYinHeadChar(sci.getCompName()));
		sci.setCompShortSpelCode(PinYin.getPinYinHeadChar(sci
				.getCompShortName()));
		sci.setUpdDatetime(DateUtil.getTimeStamp());
		detail.setUpdUser(rci.getAuditor());
		detail.setRegCap(rci.getRegCap().doubleValue());
		detail.setBizLiceStartDate(DateUtil.getTimeStamp(rci
				.getBizLiceStartDate()));
		detail.setBizLiceEndDate(DateUtil.getTimeStamp(rci.getBizLiceEndDate()));
		detail.setIndusCodeStartDate(DateUtil.getTimeStamp(rci
				.getIndusCodeStartDate()));
		detail.setIndusCodeEndDate(DateUtil.getTimeStamp(rci
				.getIndusCodeEndDate()));
		detail.setUpdUser(rci.getAuditor());
		detail.setUpdDatetime(sci.getUpdDatetime());
		sci.setStdCompinfoDetail(null);
		compinfoDao.addAndEdit(sci);
		detail.setCompId(sci.getCompId());
		compinfoDetailDao.addAndEdit(detail);
		// 入日志表
		StdCompinfoLog compLog = new StdCompinfoLog();
		StdCompinfoDetailLog detailLog = new StdCompinfoDetailLog();
		BeanUtils.copyProperties(sci, compLog);
		BeanUtils.copyProperties(detail, detailLog);
		compinfoLogDao.add(compLog);
		detailLog.setLogId(compLog.getLogId());
		compinfoDetailDao.add(detailLog);
	}

	/**
	 * @category 根据医疗机构相应等级获取其Name
	 * @author 韩守松
	 * @date   2015年10月23日
	 * @param  @param classifyId
	 * @param  @return
	 */
	public String getClassifyName(String classifyId) {
		return userAuditDao.getClassifyName(classifyId);
	}
	
	/**
	 * @category 根据医疗机构相应等级获取其Name
	 * @author 韩守松
	 * @date   2015年10月23日
	 * @param  @param classifyId
	 * @param  @return
	 */
	public String getLevelName(String levelId) {
		return userAuditDao.getLevelName(levelId);
	}
}
